home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Source Code
/
Libraries
/
CW GUSI 1.6.4
/
Examples
/
GUSIAtlkTest.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-01-23
|
4KB
|
198 lines
/*********************************************************************
File : GUSI - Grand Unified Socket Interface
File : GUSIAtlkTest - Test appletalk sockets
Author : Matthias Neeracher <neeri@iis.ethz.ch>
Language : MPW C
$Log: GUSIAtlkTest.c,v $
Revision 1.2 1994/12/31 01:05:05 neeri
ANSIfy (omitting parameter names was illegal).
Revision 1.1 1994/02/25 02:46:44 neeri
Initial revision
Revision 0.6 1992/10/14 00:00:00 neeri
Fix usage messages
Revision 0.5 1992/09/08 00:00:00 neeri
Factor out more common code
Revision 0.4 1992/07/31 00:00:00 neeri
Test select()
Revision 0.3 1992/07/26 00:00:00 neeri
Rewrote for symbolic adresses and new testing gear.
Revision 0.2 1992/05/13 00:00:00 neeri
Adapted for AppleTalk sockets
Revision 0.1 1992/04/17 00:00:00 neeri
Handle SIOW activate/update
*********************************************************************/
#include <GUSI.h>
#include "GUSITest.h"
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "Events.h"
extern int GUSIDefaultSpin(spin_msg, long);
sa_constr_atlk Constr = {
1,
{
{
nil, "\pGUSIAtlkTest"
},
{
nil, ""
},
{
nil, ""
},
{
nil, ""
}
}
};
void Socket(char ch1, char ch2, const char * line)
{
sock = socket(AF_APPLETALK, SOCK_STREAM, 0);
if (sock == -1) {
printf("# socket() returned error %s\n", Explain());
Where();
}
}
void Bind(char ch1, char ch2, const char * cmd)
{
struct sockaddr_atlk_sym addr;
Str63 obj;
if (sock == -1) {
printf("# socket is not open\n");
Where();
return;
}
if (sscanf(cmd, "%s", (char *) (obj+1)) == 1) {
addr.family = ATALK_SYMADDR;
obj[0] = strlen((char *) (obj+1));
NBPSetEntity((Ptr) &addr.name, obj, "\pGUSIAtlkTest", "\p*");
} else {
Usage(ch1, ch2);
return;
}
if (bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_atlk_sym))) {
printf("bind(\"%s\") returned error %s\n", (char *) (obj+1), Explain());
Where();
}
}
void Accept(char ch1, char ch2, const char * line)
{
int len;
struct sockaddr_atlk addr;
if (sock == -1) {
printf("# socket is not open\n");
Where();
return;
}
if (accsock != -1) {
printf("# can't accept more than one connection\n");
Where();
return;
}
len = sizeof(struct sockaddr_atlk);
sock = accept(accsock = sock, (struct sockaddr *) &addr, &len);
if (sock < 0) {
printf("# accept() returned error %s\n", Explain());
sock = accsock;
accsock = -1;
} else
printf(
"# accepted connection from [%d]%d:%d\n",
addr.addr.aNet,
addr.addr.aNode,
addr.addr.aSocket);
Where();
}
void Connect(char ch1, char ch2, const char * cmd)
{
int len;
struct sockaddr_atlk_sym symaddr;
struct sockaddr_atlk numaddr;
Str63 obj;
if (sock == -1) {
printf("# socket is not open\n");
Where();
return;
}
if (sscanf(cmd, "%s", (char *) (obj+1)) == 1) {
symaddr.family = ATALK_SYMADDR;
obj[0] = strlen((char *) (obj+1));
NBPSetEntity((Ptr) &symaddr.name, obj, "\pGUSIAtlkTest", "\p*");
if (connect(sock, (struct sockaddr *) &symaddr, sizeof(struct sockaddr_atlk_sym))) {
printf("# connect(\"%s\") returned error %s\n", (char *) (obj+1), Explain());
Where();
}
} else {
len = sizeof(struct sockaddr_atlk);
if (choose(AF_APPLETALK, 0, "Yeah ?", &Constr, 0, &numaddr, &len)) {
printf("# choose() returned error %s\n", Explain());
Where();
return;
}
if (connect(sock, (struct sockaddr *) &numaddr, len)) {
printf(
"# connect([%d]%d:%d) returned error %s\n",
numaddr.addr.aNet,
numaddr.addr.aNode,
numaddr.addr.aSocket,
Explain());
Where();
}
}
}
main(int argc, char ** argv)
{
GUSISetup(GUSIwithSIOUXSockets);
GUSISetup(GUSIwithAppleTalkSockets);
printf("GUSIAtlkTest MN 10Jun94\n\n");
COMMAND('s', 's', Socket, "", "Create a stream socket");
COMMAND('a', 'c', Accept, "", "Accept a connection");
COMMAND('b', 'd', Bind, "objectname", "Bind to address");
COMMAND('c', 'o', Connect, "[objectname]","Connect to address");
AddSocketCommands();
RunTest(argc, argv);
CleanupSockets();
}